{
 "cells": [
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "CLUEBenchmark的头条中文新闻分类  数据EDA过程\n",
    "任务介绍：https://www.cluebenchmarks.com/introduce.html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def convert_df(file_path, task):\n",
    "    with open(file_path, encoding='utf-8') as fr:\n",
    "        lines = fr.readlines()\n",
    "    label_list = []\n",
    "    sentence_list = []\n",
    "    ids = []\n",
    "    for line in lines:\n",
    "        json_str = json.loads(line)\n",
    "        if task == 'test':\n",
    "            ids.append(json_str['id'])\n",
    "            sentence_list.append(json_str['sentence'])\n",
    "        else:\n",
    "            label_list.append(json_str['label'])\n",
    "            sentence_list.append(json_str['sentence'])\n",
    "    if task == 'test':\n",
    "        data_dict = {'id': ids, 'text': sentence_list}\n",
    "    else:\n",
    "        data_dict = {'label': label_list, 'text': sentence_list}\n",
    "    data = pd.DataFrame(data_dict)\n",
    "    \n",
    "    return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  label                                            text\n",
      "0   108    上课时学生手机响个不停，老师一怒之下把手机摔了，家长拿发票让老师赔，大家怎么看待这种事？\n",
      "1   104  商赢环球股份有限公司关于延期回复上海证券交易所对公司2017年年度报告的事后审核问询函的公告\n",
      "2   106                通过中介公司买了二手房，首付都付了，现在卖家不想卖了。怎么处理？\n",
      "3   112                             2018年去俄罗斯看世界杯得花多少钱？\n",
      "4   109                           剃须刀的个性革新，雷明登天猫定制版新品首发\n",
      "  label                            text\n",
      "0   102      江疏影甜甜圈自拍，迷之角度竟这么好看，美吸引一切事物\n",
      "1   110  以色列大规模空袭开始！伊朗多个军事目标遭遇打击，誓言对等反击\n",
      "2   104           出栏一头猪亏损300元，究竟谁能笑到最后！\n",
      "3   109                以前很火的巴铁为何现在只字不提？\n",
      "4   112   作为一名酒店从业人员，你经历过房客哪些特别没有素质的行为？\n"
     ]
    }
   ],
   "source": [
    "train_path = './data/train.json'\n",
    "dev_path = './data/dev.json'\n",
    "test_path = './data/test.json'\n",
    "\n",
    "train_data = convert_df(train_path, 'train')\n",
    "print(train_data.head(5))\n",
    "\n",
    "dev_data = convert_df(dev_path, 'dev')\n",
    "print(dev_data.head(5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  label                                            text  word_cnt\n",
      "0   108    上课时学生手机响个不停，老师一怒之下把手机摔了，家长拿发票让老师赔，大家怎么看待这种事？        44\n",
      "1   104  商赢环球股份有限公司关于延期回复上海证券交易所对公司2017年年度报告的事后审核问询函的公告        46\n",
      "2   106                通过中介公司买了二手房，首付都付了，现在卖家不想卖了。怎么处理？        32\n",
      "3   112                             2018年去俄罗斯看世界杯得花多少钱？        19\n",
      "4   109                           剃须刀的个性革新，雷明登天猫定制版新品首发        21\n"
     ]
    }
   ],
   "source": [
    "train_data['word_cnt'] = train_data['text'].apply(lambda x: len(x))\n",
    "print(train_data.head(5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    53360.000000\n",
       "mean        22.131241\n",
       "std          7.309860\n",
       "min          2.000000\n",
       "25%         17.000000\n",
       "50%         22.000000\n",
       "75%         28.000000\n",
       "max        145.000000\n",
       "Name: word_cnt, dtype: float64"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data['word_cnt'].describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "109    5955\n",
       "104    5200\n",
       "102    4976\n",
       "113    4851\n",
       "107    4118\n",
       "101    4081\n",
       "103    3991\n",
       "110    3632\n",
       "108    3437\n",
       "116    3390\n",
       "112    3368\n",
       "115    2886\n",
       "106    2107\n",
       "100    1111\n",
       "114     257\n",
       "Name: label, dtype: int64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data['label'].value_counts()"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "从上面的数据看出tricks：\n",
    "1.文本最长是145，大部分都是28左右\n",
    "2.label的数量是不均衡的，可以在loss计算的时候加上label的权重"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  label                                            text  word_cnt  \\\n",
      "0   108    上课时学生手机响个不停，老师一怒之下把手机摔了，家长拿发票让老师赔，大家怎么看待这种事？        44   \n",
      "1   104  商赢环球股份有限公司关于延期回复上海证券交易所对公司2017年年度报告的事后审核问询函的公告        46   \n",
      "2   106                通过中介公司买了二手房，首付都付了，现在卖家不想卖了。怎么处理？        32   \n",
      "3   112                             2018年去俄罗斯看世界杯得花多少钱？        19   \n",
      "4   109                           剃须刀的个性革新，雷明登天猫定制版新品首发        21   \n",
      "\n",
      "                                               words  \n",
      "0  上课时 学生 手机 响个 不停 老师 一怒之下 把 手机 摔 了 家长 拿 发票 让 老师 ...  \n",
      "1  商赢 环球 股份 有限公司 关于 延期 回复 上海证券交易所 对 公司 Number 年 年...  \n",
      "2       通过 中介 公司 买 了 二手房 首付 都 付 了 现在 卖家 不想 卖 了 怎么 处理  \n",
      "3                       Number 年 去 俄罗斯 看 世界杯 得花 多少 钱  \n",
      "4                      剃须刀 的 个性 革新 雷明登 天猫 定制 版 新品 首发  \n"
     ]
    }
   ],
   "source": [
    "# 分词去掉一些无用词\n",
    "import jieba\n",
    "def cut_with_jieba(text, filter=None):\n",
    "    if filter:\n",
    "        for c in filter:\n",
    "            text = text.replace(c, '')\n",
    "    words = ['Number' if word.isdigit() else word for word in jieba.cut(text)]\n",
    "    # todo 停用词表还可以加进来\n",
    "    return ' '.join(words)\n",
    "\n",
    "filter = './?？；。（()）【】{}[]!！，,<>《》+'\n",
    "\n",
    "train_data['words'] = train_data['text'].apply(lambda x: cut_with_jieba(x, filter))\n",
    "\n",
    "print(train_data.head(5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  label                            text  \\\n",
      "0   102      江疏影甜甜圈自拍，迷之角度竟这么好看，美吸引一切事物   \n",
      "1   110  以色列大规模空袭开始！伊朗多个军事目标遭遇打击，誓言对等反击   \n",
      "2   104           出栏一头猪亏损300元，究竟谁能笑到最后！   \n",
      "3   109                以前很火的巴铁为何现在只字不提？   \n",
      "4   112   作为一名酒店从业人员，你经历过房客哪些特别没有素质的行为？   \n",
      "\n",
      "                                       words  \n",
      "0      江 疏影 甜甜 圈自 拍迷 之 角度 竟 这么 好看 美 吸引 一切 事物  \n",
      "1  以色列 大规模 空袭 开始 伊朗 多个 军事 目标 遭遇 打击 誓言 对 等 反击  \n",
      "2          出栏 一头 猪 亏损 Number 元 究竟 谁 能 笑 到 最后  \n",
      "3                      以前 很火 的 巴铁 为何 现在 只字不提  \n",
      "4   作为 一名 酒店 从业人员 你 经历 过 房客 哪些 特别 没有 素质 的 行为  \n"
     ]
    }
   ],
   "source": [
    "dev_data['words'] = dev_data['text'].apply(lambda x: cut_with_jieba(x, filter))\n",
    "print(dev_data.head(5))"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "可以看出分词其实不太准确，这个地方还可以加入原始数据集中的key word"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 写入到文件\n",
    "train_data[['words', 'label']].to_csv('./data/train_data.csv', sep='\\t', encoding='utf-8', index=None)\n",
    "dev_data[['words', 'label']].to_csv('./data/dev_data.csv', sep='\\t', encoding='utf-8', index=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   id                            text  \\\n",
      "0   0  在设计史上，每当相对稳定的发展时期，这种设计思想就会成为主导   \n",
      "1   1          利希施泰纳宣布赛季结束后离队：我需要新的挑战   \n",
      "2   2                   庄家一般都是什么操盘思路？   \n",
      "3   3                  王者荣耀里搅屎棍英雄都有谁？   \n",
      "4   4          照片不小心被删，看看下面的教程，完美找回来！   \n",
      "\n",
      "                                         words  \n",
      "0  在 设计 史上 每当 相对 稳定 的 发展 时期 这种 设计 思想 就 会 成为 主导  \n",
      "1           利希 施泰纳 宣布 赛季 结束 后 离队 ： 我 需要 新 的 挑战  \n",
      "2                           庄家 一般 都 是 什么 操盘 思路  \n",
      "3                       王者 荣耀 里 搅 屎 棍 英雄 都 有 谁  \n",
      "4                照片 不 小心 被删 看看 下面 的 教程 完美 找 回来  \n"
     ]
    }
   ],
   "source": [
    "\n",
    "# 准备测试集\n",
    "test_data = convert_df(test_path, 'test')\n",
    "\n",
    "test_data['words'] = test_data['text'].apply(lambda x: cut_with_jieba(x, filter))\n",
    "\n",
    "print(test_data.head(5))\n",
    "\n",
    "test_data[['id', 'words']].to_csv('./data/test_data.csv', sep='\\t', encoding='utf-8', index=None)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:tf_envs]",
   "language": "python",
   "name": "conda-env-tf_envs-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
